"""
遍历 pdf 目录下的所有 PDF 文件,提取其中的监测时间、监测方法、仪器名称、仪器型号、仪器出厂编号等信息，
并将这些信息存储到一个字典中，最后将这些字典存储到一个列表中。
最后写入到excel文件中
"""

import pdfplumber
import re
import os
import pandas as pd
from pathlib import Path


def clean_text(text):
    """清理文本中的换行符和多余空格"""
    if not text:
        return ""
    # 替换各种换行符为空格，然后合并多余空格
    return " ".join(str(text).replace("\n", "").replace("\r", "").split())


def extract_pdf_data_with_pdfplumber(pdf_path):
    # 初始化结果字典，移除监测时间和监测方法
    result = {
        "监测对象": "",  # 监测对象
        "使用开始时间": "",  # 使用开始时间
        "使用结束时间": "",  # 使用结束时间
        "仪器名称": "",  # 仪器名称
        "仪器型号": "",  # 仪器型号
        "仪器出厂编号": "",  # 仪器出厂编号
        "序号": "",
        "主检人": "",
    }
    with pdfplumber.open(pdf_path) as pdf:
        # 提取第一页项目名称
        first_page = pdf.pages[0]
        first_page_text = first_page.extract_text()
        # 使用正则表达式提取目标内容
        pattern = r"第(\d+)号\n(.*?)\n项目名称："
        project_name_match = re.search(
            pattern, first_page_text, re.DOTALL
        )  # re.DOTALL参数确保.可以匹配换行符，strip()用于去除可能存在的前后空白字符。
        if project_name_match:
            result["序号"] = clean_text(project_name_match.group(1))
            result["监测对象"] = clean_text(project_name_match.group(2))
        print(result["序号"])
        print(result["监测对象"])

        # 提取第4页数据主检人的
        checker_page = pdf.pages[3]
        checker_page_text = checker_page.extract_text()
        pattern1 = r"\n监测人\s+([^\s]+)"

        project_name_match = re.search(
            pattern1, checker_page_text, re.DOTALL
        )  # re.DOTALL参数确保.可以匹配换行符，strip()用于去除可能存在的前后空白字符。
        if project_name_match:
            result["主检人"] = clean_text(project_name_match.group(1))

        if not result["主检人"]:
            checker_page = pdf.pages[4]
            checker_page_text = checker_page.extract_text()
            pattern1 = r"\n监测人\s+([^\s]+)"

            project_name_match = re.search(
                pattern1, checker_page_text, re.DOTALL
            )  # re.DOTALL参数确保.可以匹配换行符，strip()用于去除可能存在的前后空白字符。
            if project_name_match:
                result["主检人"] = clean_text(project_name_match.group(1))

        print(result["主检人"])
        # 提取第三页数据
        third_page = pdf.pages[2]
        third_page_text = third_page.extract_text()

        # 提取监测时间
        monitoring_time_match = re.search(
            r"监测时间[:：]\s*([^\n]+(?:\n[^\n]+)*?)\s*(?:通信基站信息|监测方法)",
            third_page_text,
            re.DOTALL,
        )
        if monitoring_time_match:
            monitoring_time_text = clean_text(monitoring_time_match.group(1))
            time_pattern = (
                r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2})至(\d{4}-\d{2}-\d{2} \d{2}:\d{2})"
            )
            time_match = re.search(time_pattern, monitoring_time_text)
            if time_match:
                result["使用开始时间"] = time_match.group(1)
                result["使用结束时间"] = time_match.group(2)
        # 提取仪器信息 - 使用pdfplumber的表格提取功能
        tables = third_page.extract_tables()
        if tables:
            for table in tables:
                if len(table) > 1 and any("仪器名称" in str(cell) for cell in table[0]):
                    headers = [clean_text(cell) for cell in table[0]]
                    data = table[1] if len(table) > 1 else []
                    # pdf表格头对应result键
                    header_mapping = {
                        "仪器名称": "仪器名称",
                        "仪器型号": "仪器型号",
                        "仪器编号": "仪器出厂编号",
                    }

                    for i, header in enumerate(headers):
                        if header in header_mapping and i < len(data):
                            result[header_mapping[header]] = clean_text(data[i])

        # 如果表格提取失败，使用正则表达式作为后备方案
        # 修改为一级结构访问
        if not result.get("仪器名称"):
            instrument_info_match = re.search(
                r"仪器名称\s*仪器型号\s*仪器编号\s*([^\n]+)\s+([^\n]+)\s+([^\n]+)",
                third_page_text,
            )
            if instrument_info_match:
                result["仪器名称"] = clean_text(instrument_info_match.group(1))
                result["仪器型号"] = clean_text(instrument_info_match.group(2))
                result["仪器出厂编号"] = clean_text(instrument_info_match.group(3))
    return result


def append_dict_to_excel(file_path, new_data):
    """
    将字典数据追加到Excel文件

    参数:
        file_path: Excel文件路径
        new_data: 要追加的字典数据，格式如{'列名1': 值1, '列名2': 值2, ...}
    """
    # 创建新数据的DataFrame
    new_df = pd.DataFrame([new_data])

    # 检查文件是否存在
    if os.path.exists(file_path):
        # 读取现有数据
        existing_df = pd.read_excel(file_path)
        # 追加新数据
        combined_df = pd.concat([existing_df, new_df], ignore_index=True)
    else:
        # 如果文件不存在，直接使用新数据
        combined_df = new_df

        # 将序号列转换为整数类型
        if "序号" in combined_df.columns:
            combined_df["序号"] = combined_df["序号"].fillna(0).astype(int)

        # 写入Excel文件
    combined_df.to_excel(file_path, index=False)
    print(f"数据已成功追加到 {file_path}")


# 从第五页表格中取项目名称，暂不用
def get_name_way2(pdf_path):
    with pdfplumber.open(pdf_path) as pdf:
        # 提取第一页项目名称
        six_page = pdf.pages[5]
        tables = six_page.extract_tables()
        pjname = tables[0][0][1]
        print(pjname)


if __name__ == "__main__":
    # 获取 pdf 目录路径
    pdf_dir = os.path.join(os.path.dirname(__file__), "pdf")
    excel_file = os.path.join(
        os.path.dirname(__file__), "template", "仪器设备使用记录.xlsx"
    )
    all_extracted_data = []

    # 遍历 pdf 目录下的所有 PDF 文件
    for root, _, files in os.walk(pdf_dir):
        for file in files:
            if file.lower().endswith(".pdf"):
                pdf_path = os.path.join(root, file)
                # 解析 PDF 文件
                extracted_data = extract_pdf_data_with_pdfplumber(pdf_path)
                new_filename = os.path.join(
                    pdf_dir,
                    extracted_data["序号"] + "-" + extracted_data["监测对象"] + ".pdf",
                )
                os.rename(pdf_path, new_filename)
                print(f"已将 {pdf_path} 重命名为 {new_filename}")

                all_extracted_data.append(extracted_data)

    # 将所有解析结果转换为 DataFrame
    all_data_df = pd.DataFrame(all_extracted_data)

    # 一次性将所有数据追加到 Excel 文件
    if os.path.exists(excel_file):
        existing_df = pd.read_excel(excel_file)
        combined_df = pd.concat([existing_df, all_data_df], ignore_index=True)
    else:
        combined_df = all_data_df
        # 将序号列转换为整数类型
    combined_df["序号"] = combined_df["序号"].fillna(0).astype(int)
    combined_df = combined_df.sort_values(by="序号", ascending=True)
    combined_df.to_excel(excel_file, index=False, engine="openpyxl")
